Return to Homepage
Introduction
In the following report, I will investigate and examine which animal
is the king of attacks whether on land or in the water, by comparing the
attacks from sharks, wolves, and alligators. While this data has already
been somewhat cleaned and contains fairly simple information, this final
project aims to investigate the disparities between these three animals,
the attack locations, and the effected population. In simpler terms, who
is responsible for the most attacks? Which populations are the most
effected? Where these attacks provoked or not? These are just some of
the questions I hope to explore in this writing.
Background
This project was inspired in part by my family, my mother is from
Florida and there have been some very interesting documentaries done on
all these animals. It was also inspired by general happen stance: I
found a very nice data set on Kaggle and felt it could be an interesting
take on a seemingly dull data set. As mentioned, this data set was
found:
Fatal
Alligator Attacks
Shark
Attacks
Shark
Attacks By Hemispheres
Global
Wolf Attacks
The data set consists of various reported statistics regarding these
different attacks. Most individuals were attacked were predatory.
However, some individuals were reported to provoke the animal. Different
age groups were attacked each time.
Prevention would be great, but there is not signs for those that will
and could be attacked. Alligators, sharks, and wolves have different
reasons to attack.
Data
# load all necessary libraries
library(tidyverse)
library(janitor)
library(leaflet)
library(dplyr)
library(ggplot2)
library(lubridate)
library(stringr)
# reading in kaggle data sets
gator <- read.csv("predators/fatal_alligator_attacks_US.csv")
g_wolves <- read.csv("predators/global_wolves.csv")
shark_1 <- read.csv("predators/Shark_attacks/attacks.csv")
shark_2 <- read.csv("predators/shark_attacks.csv")
shark_3 <- read.csv("predators/Shark_attacks/list_coor_australia.csv")
This data set was retrieved from Kaggle and has already been
somewhat cleaned for analysis. However, there are some
changes I wanted to make to the data structure, changing missing
values/empty spaces, cleaning the names, and improving characters found
throughout the data set. The following code and outputs demonstrate the
changes I’ve made to allow for smoother data analysis:
# convert column titles to snake_case
gator <-clean_names(gator)
g_wolves <-clean_names(g_wolves)
shark_1 <- clean_names(shark_1)
shark_2 <-clean_names(shark_2)
# converts all N/A chr values to actual missing values and fills in empty spaces with missing values
g_wolves$type_of_attack[is.na(g_wolves$type_of_attack) | g_wolves$type_of_attack == ""] <- "Unknown"
shark_2$type[is.na(shark_2$type) | shark_2$type == "Invalid"] <- "Unknown"
shark_1 <- shark_1[!is.na(shark_1$type), ]
shark_1_subset <- shark_1[1:6302, ]
nrow(shark_1)
## [1] 25723
## [1] 25723
# Check which rows have NA or invalid values
table(is.na(shark_1$type))
##
## FALSE
## 25723
table(shark_1$type == "Invalid")
##
## FALSE TRUE
## 25176 547
# Replace only NAs first, then Invalids
shark_1$type[is.na(shark_1$type)] <- "Unknown"
shark_1$type[shark_1$type == "Invalid"] <- "Unknown"
# converts data structure to more appropriate data types
gator <-gator %>%
mutate(location = str_extract(details, "(Miami|Florida|Georgia|Texas|Louisiana|South Carolina)"),
location = ifelse(location == "Miami", "Florida", location))
Alligator
Alligators are beautiful and dangerous animals. This data only shows
a small amount of deaths that have been caused by alligators. There was
no information about croc, even though they do have a hand in many
deaths over the years, since they invaded the South. This data shows
that Florida has had the most number of attacks. I have learned over the
years is keep an eye out whenever by water on the Southern coast, you
never know what might snap you up.

## # A tibble: 7 × 3
## # Groups: location [5]
## location sex n
## <chr> <chr> <int>
## 1 Florida female 11
## 2 Florida male 19
## 3 Georgia female 1
## 4 Louisiana male 2
## 5 South Carolina female 4
## 6 South Carolina male 1
## 7 Texas male 3

Unexpected Shark Attacks
When I first started trying to create this plot, this was the result.
Attacks happening above Greenland. I learned how wrong I was.
knitr::include_graphics("media/Unexpected_Attacks.png")

Sharks
If any of you have a unrealistic fear that there is something in the
water and you will get attacked. You’re not alone look is happening in
Australia. Zoom out and see what is happening.
colnames(shark_3) <- c("latitude", "longitude")
center_lat <- -25.2744
center_lon <- 133.7751
zoom_level <- 5
map <- leaflet() %>%
addTiles() %>%
setView(center_lon, center_lat, zoom = zoom_level)
for (i in 1:nrow(shark_3)) {
map <- map %>% addMarkers(lng = shark_3$longitude[i], lat = shark_3$latitude[i])
}
map
knitr::include_graphics("media/Australia.png")

This is what the map looks like when zoomed out. Crazy, right?
More Attacks
shark_1$type[is.na(shark_1$type) | shark_1$type == ""] <- "Unknown"
shark_1$type[is.na(shark_1$type) | shark_1$type == "Invalid"] <- "Unknown"
shark_1_subset <- shark_1[1:6302, ]
sharks <-shark_1 %>%
group_by(country) %>%
ggplot(aes(x = type)) +
geom_bar(aes(y = ..count..)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
plot(sharks)

Does anyone have an idea what boatomg is? I think they meant boating,
but messed up on their English. It is understandable to a degree,
English is hard.
More Shark Attacks
shark_2$type[is.na(shark_2$type) | shark_2$type == "Invalid"] <- "Unknown"
shark_2 %>%
group_by(area) %>%
ggplot(aes(x = type)) +
geom_bar(aes(y = ..count..)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Wolves
g_wolves$type_of_attack[is.na(g_wolves$type_of_attack) | g_wolves$type_of_attack == ""] <- "Unknown"
wolves <- g_wolves %>%
group_by(type_of_attack) %>%
ggplot(aes(x = type_of_attack)) +
geom_bar(aes(y = ..count..)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "Types of Attacks", y = "Victim Count")
wolves

More Wolves
When I was looking and trying to clean the data, there were many
factors that was affecting it. The data was not pretty even after trying
to clean it. They are even higher than data above, there was some data
that represented 15 people that were killed by wolves, all 15 people
were placed on the same line.
# Read the CSV file (assuming it's saved as 'global_wolves.csv')
data <- read.csv("predators/global_wolves.csv", stringsAsFactors = FALSE)
data <- clean_names(data)
# Use a regular expression to extract the country from the 'Location' column
data$country <- sub(".*,\\s*(.*)$", "\\1", data$location)
# Extract the country from location string
data$country <- str_extract(data$location, "[^,]+$")
# Trim any leading/trailing whitespace
data$country <- trimws(data$country)
# Replace blank box with NA
data <- data %>%
mutate(type_of_attack = ifelse(type_of_attack == "", NA, type_of_attack))
w_attacks <-data %>%
ggplot(aes(x = country, fill = type_of_attack)) +
geom_bar(position = "dodge") +
coord_flip() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Attacks and Country",
x = "Country",
y = "Count of Attacks") +
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.text.y = element_text(size = 8))
knitr::include_graphics("media/wolves_attacks.png")

King
The King of attacks is the shark. The data shows that sharks have
attacked, look at the map of Australia again, every marker is where a
shark attack has occurred. Also another reason why the shark data is
king is due to a lack and missing data from both the wolves and gators.
If there was data for Nile Crocs, there might be some competition.
knitr::include_graphics("media/shark.png")

Return to Homepage
LS0tCnRpdGxlOiAiRmluYWxfUHJvamVjdDogV2hvIGlzIEtpbmcgb2YgQXR0YWNrcz8iCmF1dGhvcjogIk1lYWdoYW4gQmFycmV0dCIKZGF0ZTogIjIwMjUtMDQtMDgiCm91dHB1dDogCiAgICBodG1sX2RvY3VtZW50OgogICAgICAgIHRoZW1lOiBwYXBlcgogICAgICAgIGhpZ2hsaWdodDogdGFuZ28KICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZmxvYXQ6CiAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgICAgZGZfcHJpbnQ6IGthYmxlCiAgICAgICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICAgICAgbW9kZTogc2VsZmNvbnRhaW5lZAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgY2FjaGUgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgpbUmV0dXJuIHRvIEhvbWVwYWdlXSguLi9pbmRleC5odG1sKQoKIyAqKkludHJvZHVjdGlvbioqCkluIHRoZSBmb2xsb3dpbmcgcmVwb3J0LCBJIHdpbGwgaW52ZXN0aWdhdGUgYW5kIGV4YW1pbmUgd2hpY2ggYW5pbWFsIGlzIHRoZSBraW5nIG9mIGF0dGFja3Mgd2hldGhlciBvbiBsYW5kIG9yIGluIHRoZSB3YXRlciwgYnkgY29tcGFyaW5nIHRoZSBhdHRhY2tzIGZyb20gc2hhcmtzLCB3b2x2ZXMsIGFuZCBhbGxpZ2F0b3JzLiBXaGlsZSB0aGlzIGRhdGEgaGFzIGFscmVhZHkgYmVlbiBzb21ld2hhdCBjbGVhbmVkIGFuZCBjb250YWlucyBmYWlybHkgc2ltcGxlIGluZm9ybWF0aW9uLCB0aGlzIGZpbmFsIHByb2plY3QgYWltcyB0byBpbnZlc3RpZ2F0ZSB0aGUgZGlzcGFyaXRpZXMgYmV0d2VlbiB0aGVzZSB0aHJlZSBhbmltYWxzLCB0aGUgYXR0YWNrIGxvY2F0aW9ucywgYW5kIHRoZSBlZmZlY3RlZCBwb3B1bGF0aW9uLiBJbiBzaW1wbGVyIHRlcm1zLCB3aG8gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBtb3N0IGF0dGFja3M/IFdoaWNoIHBvcHVsYXRpb25zIGFyZSB0aGUgbW9zdCBlZmZlY3RlZD8gV2hlcmUgdGhlc2UgYXR0YWNrcyBwcm92b2tlZCBvciBub3Q/IFRoZXNlIGFyZSBqdXN0IHNvbWUgb2YgdGhlIHF1ZXN0aW9ucyBJIGhvcGUgdG8gZXhwbG9yZSBpbiB0aGlzIHdyaXRpbmcuIAoKIyAqKkJhY2tncm91bmQqKgpUaGlzIHByb2plY3Qgd2FzIGluc3BpcmVkIGluIHBhcnQgYnkgbXkgZmFtaWx5LCBteSBtb3RoZXIgaXMgZnJvbSBGbG9yaWRhIGFuZCB0aGVyZSBoYXZlIGJlZW4gc29tZSB2ZXJ5IGludGVyZXN0aW5nIGRvY3VtZW50YXJpZXMgZG9uZSBvbiBhbGwgdGhlc2UgYW5pbWFscy4gSXQgd2FzIGFsc28gaW5zcGlyZWQgYnkgZ2VuZXJhbCBoYXBwZW4gc3RhbmNlOiBJIGZvdW5kIGEgdmVyeSBuaWNlIGRhdGEgc2V0IG9uIEthZ2dsZSBhbmQgZmVsdCBpdCBjb3VsZCBiZSBhbiBpbnRlcmVzdGluZyB0YWtlIG9uIGEgc2VlbWluZ2x5IGR1bGwgZGF0YSBzZXQuIEFzIG1lbnRpb25lZCwgdGhpcyBkYXRhIHNldCB3YXMgZm91bmQ6IAoKW0ZhdGFsIEFsbGlnYXRvciBBdHRhY2tzXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2RhbmVsYS9mYXRhbC1hbGxpZ2F0b3ItYXR0YWNrcy11cz9yZXNvdXJjZT1kb3dubG9hZCZzZWxlY3Q9ZmF0YWxfYWxsaWdhdG9yX2F0dGFja3NfVVMuY3N2KQoKW1NoYXJrIEF0dGFja3NdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZmVsaXBlZXNjL3NoYXJrLWF0dGFjay1kYXRhc2V0P3BoYXNlPUZpbmlzaFNTT1JlZ2lzdHJhdGlvbiZyZXR1cm5Vcmw9JTJGZGF0YXNldHMlMkZmZWxpcGVlc2MlMkZzaGFyay1hdHRhY2stZGF0YXNldCUyRnZlcnNpb25zJTJGMSUzRnJlc291cmNlJTNEZG93bmxvYWQmU1NPUmVnaXN0cmF0aW9uVG9rZW49Q2ZESjhQSFNDTDlrOXMxSHVKMmNSRkJGaHVoZ3B4TjBnX0FURElUel8tY1hWRy1uNS1TOFBjQW5aZGdEWEhibjd1ZDBpYVZZTGVZV2tZbkZUWTZOYzRKRnQxbnlXQVpzVHVoUjh2U1B2M29rNVRQNEF0UlJLOS1JekdEcVN6WktVR3hNYXlLSzVOS2tkV2dld1VWWVBNRjFhSmw0cGhQQjRPYndYbDJBSzc2OThDRTIzMHlzczlrZ2JBVktjWkFDQmcwMEZtU1BQa1RzWUdobFd1NHozVnJlenZaRFhvTG4yZVlheUkwNzg0SkRBbmFhMUw1S1ZzdnB6b2xHVGs5VDhobjd1RHRYMjlyd05SYVFXeTE5QnNWMEtaN1RjZkRmRnBZdlJEOHJTTXJxNHlFdWw3LUNSYTJMMVI1cVd2eEVPWU1sR0ktVkZOODdzZ2FiT1ByZ19DSjZqY0phVm8wQ2NzUSZEaXNwbGF5TmFtZT1NZWFnaGFuK0JhcnJldHQpCgpbU2hhcmsgQXR0YWNrcyBCeSBIZW1pc3BoZXJlc10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9jb2RlL2ljZWNyZWFtNC9zaGFyay1hdHRhY2tzLWJ5LWhlbWlzcGhlcmVzL25vdGVib29rKSAKCltHbG9iYWwgV29sZiBBdHRhY2tzXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2RhbmVsYS9nbG9iYWwtd29sZi1hdHRhY2tzP3NlbGVjdD1nbG9iYWxfd29sdmVzLmNzdikgCgpUaGUgZGF0YSBzZXQgY29uc2lzdHMgb2YgdmFyaW91cyByZXBvcnRlZCBzdGF0aXN0aWNzIHJlZ2FyZGluZyB0aGVzZSBkaWZmZXJlbnQgYXR0YWNrcy4gTW9zdCBpbmRpdmlkdWFscyB3ZXJlIGF0dGFja2VkIHdlcmUgcHJlZGF0b3J5LiBIb3dldmVyLCBzb21lIGluZGl2aWR1YWxzIHdlcmUgcmVwb3J0ZWQgdG8gcHJvdm9rZSB0aGUgYW5pbWFsLiBEaWZmZXJlbnQgYWdlIGdyb3VwcyB3ZXJlIGF0dGFja2VkIGVhY2ggdGltZS4gCgpQcmV2ZW50aW9uIHdvdWxkIGJlIGdyZWF0LCBidXQgdGhlcmUgaXMgbm90IHNpZ25zIGZvciB0aG9zZSB0aGF0IHdpbGwgYW5kIGNvdWxkIGJlIGF0dGFja2VkLiBBbGxpZ2F0b3JzLCBzaGFya3MsIGFuZCB3b2x2ZXMgaGF2ZSBkaWZmZXJlbnQgcmVhc29ucyB0byBhdHRhY2suICAKCiMgKipEYXRhKioKYGBge3IsIGVjaG8gPSBUUlVFfQojIGxvYWQgYWxsIG5lY2Vzc2FyeSBsaWJyYXJpZXMgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShzdHJpbmdyKQoKIyByZWFkaW5nIGluIGthZ2dsZSBkYXRhIHNldHMgCmdhdG9yIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZmF0YWxfYWxsaWdhdG9yX2F0dGFja3NfVVMuY3N2IikKCmdfd29sdmVzIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZ2xvYmFsX3dvbHZlcy5jc3YiKQoKc2hhcmtfMSA8LSByZWFkLmNzdigicHJlZGF0b3JzL1NoYXJrX2F0dGFja3MvYXR0YWNrcy5jc3YiKQoKc2hhcmtfMiA8LSByZWFkLmNzdigicHJlZGF0b3JzL3NoYXJrX2F0dGFja3MuY3N2IikKCnNoYXJrXzMgPC0gcmVhZC5jc3YoInByZWRhdG9ycy9TaGFya19hdHRhY2tzL2xpc3RfY29vcl9hdXN0cmFsaWEuY3N2IikKCmBgYApUaGlzIGRhdGEgc2V0IHdhcyByZXRyaWV2ZWQgZnJvbSBLYWdnbGUgYW5kIGhhcyBhbHJlYWR5IGJlZW4gKipzb21ld2hhdCoqIGNsZWFuZWQgZm9yIGFuYWx5c2lzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjaGFuZ2VzIEkgd2FudGVkIHRvIG1ha2UgdG8gdGhlIGRhdGEgc3RydWN0dXJlLCBjaGFuZ2luZyBtaXNzaW5nIHZhbHVlcy9lbXB0eSBzcGFjZXMsIGNsZWFuaW5nIHRoZSBuYW1lcywgYW5kIGltcHJvdmluZyBjaGFyYWN0ZXJzIGZvdW5kIHRocm91Z2hvdXQgdGhlIGRhdGEgc2V0LiBUaGUgZm9sbG93aW5nIGNvZGUgYW5kIG91dHB1dHMgZGVtb25zdHJhdGUgdGhlIGNoYW5nZXMgSSd2ZSBtYWRlIHRvIGFsbG93IGZvciBzbW9vdGhlciBkYXRhIGFuYWx5c2lzOiAKCmBgYHtyLCBlY2hvPVRSVUV9CgojIGNvbnZlcnQgY29sdW1uIHRpdGxlcyB0byBzbmFrZV9jYXNlIAoKZ2F0b3IgPC1jbGVhbl9uYW1lcyhnYXRvcikKCmdfd29sdmVzIDwtY2xlYW5fbmFtZXMoZ193b2x2ZXMpCgpzaGFya18xIDwtIGNsZWFuX25hbWVzKHNoYXJrXzEpCgpzaGFya18yIDwtY2xlYW5fbmFtZXMoc2hhcmtfMikKYGBgCgpgYGB7ciBldmFsID0gVFJVRX0KIyBjb252ZXJ0cyBhbGwgTi9BIGNociB2YWx1ZXMgdG8gYWN0dWFsIG1pc3NpbmcgdmFsdWVzIGFuZCBmaWxscyBpbiBlbXB0eSBzcGFjZXMgd2l0aCBtaXNzaW5nIHZhbHVlcyAKCmdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrW2lzLm5hKGdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrKSB8IGdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrID09ICIiXSA8LSAiVW5rbm93biIKCnNoYXJrXzIkdHlwZVtpcy5uYShzaGFya18yJHR5cGUpIHwgc2hhcmtfMiR0eXBlID09ICJJbnZhbGlkIl0gPC0gIlVua25vd24iCgpzaGFya18xIDwtIHNoYXJrXzFbIWlzLm5hKHNoYXJrXzEkdHlwZSksIF0gCnNoYXJrXzFfc3Vic2V0IDwtIHNoYXJrXzFbMTo2MzAyLCBdCm5yb3coc2hhcmtfMSkKbGVuZ3RoKHNoYXJrXzEkdHlwZSkKCiMgQ2hlY2sgd2hpY2ggcm93cyBoYXZlIE5BIG9yIGludmFsaWQgdmFsdWVzCnRhYmxlKGlzLm5hKHNoYXJrXzEkdHlwZSkpICAKdGFibGUoc2hhcmtfMSR0eXBlID09ICJJbnZhbGlkIikgIAoKIyBSZXBsYWNlIG9ubHkgTkFzIGZpcnN0LCB0aGVuIEludmFsaWRzCnNoYXJrXzEkdHlwZVtpcy5uYShzaGFya18xJHR5cGUpXSA8LSAiVW5rbm93biIKc2hhcmtfMSR0eXBlW3NoYXJrXzEkdHlwZSA9PSAiSW52YWxpZCJdIDwtICJVbmtub3duIgoKCiMgY29udmVydHMgZGF0YSBzdHJ1Y3R1cmUgdG8gbW9yZSBhcHByb3ByaWF0ZSBkYXRhIHR5cGVzCmdhdG9yIDwtZ2F0b3IgJT4lIAogIG11dGF0ZShsb2NhdGlvbiA9IHN0cl9leHRyYWN0KGRldGFpbHMsICIoTWlhbWl8RmxvcmlkYXxHZW9yZ2lhfFRleGFzfExvdWlzaWFuYXxTb3V0aCBDYXJvbGluYSkiKSwKICAgICAgICAgbG9jYXRpb24gPSBpZmVsc2UobG9jYXRpb24gPT0gIk1pYW1pIiwgIkZsb3JpZGEiLCBsb2NhdGlvbikpCgpgYGAKCiMgKipBbGxpZ2F0b3IqKgoKQWxsaWdhdG9ycyBhcmUgYmVhdXRpZnVsIGFuZCBkYW5nZXJvdXMgYW5pbWFscy4gVGhpcyBkYXRhIG9ubHkgc2hvd3MgYSBzbWFsbCBhbW91bnQgb2YgZGVhdGhzIHRoYXQgaGF2ZSBiZWVuIGNhdXNlZCBieSBhbGxpZ2F0b3JzLiBUaGVyZSB3YXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgY3JvYywgZXZlbiB0aG91Z2ggdGhleSBkbyBoYXZlIGEgaGFuZCBpbiBtYW55IGRlYXRocyBvdmVyIHRoZSB5ZWFycywgc2luY2UgdGhleSBpbnZhZGVkIHRoZSBTb3V0aC4gVGhpcyBkYXRhIHNob3dzIHRoYXQgRmxvcmlkYSBoYXMgaGFkIHRoZSBtb3N0IG51bWJlciBvZiBhdHRhY2tzLiBJIGhhdmUgbGVhcm5lZCBvdmVyIHRoZSB5ZWFycyBpcyBrZWVwIGFuIGV5ZSBvdXQgd2hlbmV2ZXIgYnkgd2F0ZXIgb24gdGhlIFNvdXRoZXJuIGNvYXN0LCB5b3UgbmV2ZXIga25vdyB3aGF0IG1pZ2h0IHNuYXAgeW91IHVwLiAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmdhdG9yICU+JQogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCBmb3JtYXQgPSAiJUIgJWQsICVZIikpICU+JSAgCiAgZmlsdGVyKGFnZSAhPSAiPyIpICU+JQogIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JQogIGZpbHRlcihhZ2UgPj0gMiAmIGFnZSA8PSA4MSkgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5pbnRlZ2VyKGZvcm1hdChkYXRlLCAiJVkiKSkpICU+JSAgCiAgYXJyYW5nZShhZ2UpICU+JQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBhZ2UsIGNvbG9yID0gbG9jYXRpb24pKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJBZ2UiKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KZGVhdGhzIDwtZ2F0b3IgJT4lCiAgZmlsdGVyKGxvY2F0aW9uICE9ICI/IikgJT4lICAKICBmaWx0ZXIoc2V4ICE9ICI/IikgJT4lICAgICAgIAogIGdyb3VwX2J5KGxvY2F0aW9uLCBzZXgpICU+JQogIHRhbGx5KCkKCnByaW50KGRlYXRocykKCnZpY3RpbXNfYnlfc3RhdGUgPC1kZWF0aHMgJT4lIAogIGdncGxvdChhZXMoeCA9IGxvY2F0aW9uLCB5ID0gbiwgZmlsbCA9IHNleCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArICAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjUpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIAogIGxhYnModGl0bGUgPSAiQWxsaWdhdG9yIEF0dGFja3MgYnkgU3RhdGUiLAogICAgICAgeCA9ICJTdGF0ZSIsIHkgPSAiTnVtYmVyIG9mIFZpY3RpbXMiLCBmaWxsID0gIlNleCIpCgp2aWN0aW1zX2J5X3N0YXRlCmBgYAoKIyAqKlVuZXhwZWN0ZWQgU2hhcmsgQXR0YWNrcyoqCldoZW4gSSBmaXJzdCBzdGFydGVkIHRyeWluZyB0byBjcmVhdGUgdGhpcyBwbG90LCB0aGlzIHdhcyB0aGUgcmVzdWx0LiBBdHRhY2tzIGhhcHBlbmluZyBhYm92ZSBHcmVlbmxhbmQuIEkgbGVhcm5lZCBob3cgd3JvbmcgSSB3YXMuIApgYGB7ciwgb3V0LndpZHRoPSI3MCUiLCBvdXQuaGVpZ2h0PSI3MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWVkaWEvVW5leHBlY3RlZF9BdHRhY2tzLnBuZyIpCmBgYAoKIyAqKlNoYXJrcyoqCklmIGFueSBvZiB5b3UgaGF2ZSBhIHVucmVhbGlzdGljIGZlYXIgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgaW4gdGhlIHdhdGVyIGFuZCB5b3Ugd2lsbCBnZXQgYXR0YWNrZWQuIFlvdSdyZSBub3QgYWxvbmUgbG9vayBpcyBoYXBwZW5pbmcgaW4gQXVzdHJhbGlhLiBab29tIG91dCBhbmQgc2VlIHdoYXQgaXMgaGFwcGVuaW5nLgoKYGBge3IsIGVjaG8gPSBUUlVFfQoKY29sbmFtZXMoc2hhcmtfMykgPC0gYygibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIikKY2VudGVyX2xhdCA8LSAtMjUuMjc0NApjZW50ZXJfbG9uIDwtIDEzMy43NzUxCnpvb21fbGV2ZWwgPC0gNSAgCgptYXAgPC0gbGVhZmxldCgpICU+JQogIGFkZFRpbGVzKCkgJT4lICAKICBzZXRWaWV3KGNlbnRlcl9sb24sIGNlbnRlcl9sYXQsIHpvb20gPSB6b29tX2xldmVsKQoKZm9yIChpIGluIDE6bnJvdyhzaGFya18zKSkgewogIG1hcCA8LSBtYXAgJT4lIGFkZE1hcmtlcnMobG5nID0gc2hhcmtfMyRsb25naXR1ZGVbaV0sIGxhdCA9IHNoYXJrXzMkbGF0aXR1ZGVbaV0pCn0KCm1hcAoKYGBgCgoKYGBge3IsIG91dC53aWR0aD0iNzAlIiwgb3V0LmhlaWdodD0iNzAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm1lZGlhL0F1c3RyYWxpYS5wbmciKQpgYGAKCgpUaGlzIGlzIHdoYXQgdGhlIG1hcCBsb29rcyBsaWtlIHdoZW4gem9vbWVkIG91dC4gQ3JhenksIHJpZ2h0PwoKCiMgICoqTW9yZSBBdHRhY2tzKioKYGBge3IsIGVjaG89VFJVRX0KCnNoYXJrXzEkdHlwZVtpcy5uYShzaGFya18xJHR5cGUpIHwgc2hhcmtfMSR0eXBlID09ICIiXSA8LSAiVW5rbm93biIKc2hhcmtfMSR0eXBlW2lzLm5hKHNoYXJrXzEkdHlwZSkgfCBzaGFya18xJHR5cGUgPT0gIkludmFsaWQiXSA8LSAiVW5rbm93biIKc2hhcmtfMV9zdWJzZXQgPC0gc2hhcmtfMVsxOjYzMDIsIF0KCnNoYXJrcyA8LXNoYXJrXzEgJT4lIAogIGdyb3VwX2J5KGNvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0eXBlKSkgKwogICBnZW9tX2JhcihhZXMoeSA9IC4uY291bnQuLikpICsgCiAgZ2VvbV90ZXh0KHN0YXQgPSAnY291bnQnLCBhZXMobGFiZWwgPSAuLmNvdW50Li4pLCB2anVzdCA9IC0wLjUpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKcGxvdChzaGFya3MpCmBgYAoKCkRvZXMgYW55b25lIGhhdmUgYW4gaWRlYSB3aGF0IGJvYXRvbWcgaXM/IEkgdGhpbmsgdGhleSBtZWFudCBib2F0aW5nLCBidXQgbWVzc2VkIHVwIG9uIHRoZWlyIEVuZ2xpc2guIEl0IGlzIHVuZGVyc3RhbmRhYmxlIHRvIGEgZGVncmVlLCBFbmdsaXNoIGlzIGhhcmQuIAoKCiMgKipNb3JlIFNoYXJrIEF0dGFja3MqKgpgYGB7ciwgZWNobyA9IFRSVUV9CgpzaGFya18yJHR5cGVbaXMubmEoc2hhcmtfMiR0eXBlKSB8IHNoYXJrXzIkdHlwZSA9PSAiSW52YWxpZCJdIDwtICJVbmtub3duIgoKc2hhcmtfMiAlPiUgCiAgZ3JvdXBfYnkoYXJlYSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHR5cGUpKSArCiAgIGdlb21fYmFyKGFlcyh5ID0gLi5jb3VudC4uKSkgKyAKICBnZW9tX3RleHQoc3RhdCA9ICdjb3VudCcsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgpgYGAKCgojICAqKldvbHZlcyoqCgpgYGB7ciwgZWNobz1UUlVFfQpnX3dvbHZlcyR0eXBlX29mX2F0dGFja1tpcy5uYShnX3dvbHZlcyR0eXBlX29mX2F0dGFjaykgfCBnX3dvbHZlcyR0eXBlX29mX2F0dGFjayA9PSAiIl0gPC0gIlVua25vd24iCgp3b2x2ZXMgPC0gZ193b2x2ZXMgJT4lIAogIGdyb3VwX2J5KHR5cGVfb2ZfYXR0YWNrKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdHlwZV9vZl9hdHRhY2spKSAgKwogIGdlb21fYmFyKGFlcyh5ID0gLi5jb3VudC4uKSkgKyAKICBnZW9tX3RleHQoc3RhdCA9ICdjb3VudCcsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICBsYWJzKHggPSAiVHlwZXMgb2YgQXR0YWNrcyIsIHkgPSAiVmljdGltIENvdW50IikKCndvbHZlcwpgYGAKCiMgKipNb3JlIFdvbHZlcyoqIApXaGVuIEkgd2FzIGxvb2tpbmcgYW5kIHRyeWluZyB0byBjbGVhbiB0aGUgZGF0YSwgdGhlcmUgd2VyZSBtYW55IGZhY3RvcnMgdGhhdCB3YXMgYWZmZWN0aW5nIGl0LiBUaGUgZGF0YSB3YXMgbm90IHByZXR0eSBldmVuIGFmdGVyIHRyeWluZyB0byBjbGVhbiBpdC4gVGhleSBhcmUgZXZlbiBoaWdoZXIgdGhhbiBkYXRhIGFib3ZlLCB0aGVyZSB3YXMgc29tZSBkYXRhIHRoYXQgcmVwcmVzZW50ZWQgMTUgcGVvcGxlIHRoYXQgd2VyZSBraWxsZWQgYnkgd29sdmVzLCBhbGwgMTUgcGVvcGxlIHdlcmUgcGxhY2VkIG9uIHRoZSBzYW1lIGxpbmUuIAoKYGBge3IsIGVjaG89VFJVRX0KIyBSZWFkIHRoZSBDU1YgZmlsZSAoYXNzdW1pbmcgaXQncyBzYXZlZCBhcyAnZ2xvYmFsX3dvbHZlcy5jc3YnKQpkYXRhIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZ2xvYmFsX3dvbHZlcy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgpkYXRhIDwtIGNsZWFuX25hbWVzKGRhdGEpCgojIFVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBleHRyYWN0IHRoZSBjb3VudHJ5IGZyb20gdGhlICdMb2NhdGlvbicgY29sdW1uCmRhdGEkY291bnRyeSA8LSBzdWIoIi4qLFxccyooLiopJCIsICJcXDEiLCBkYXRhJGxvY2F0aW9uKQoKIyBFeHRyYWN0IHRoZSBjb3VudHJ5IGZyb20gbG9jYXRpb24gc3RyaW5nCmRhdGEkY291bnRyeSA8LSBzdHJfZXh0cmFjdChkYXRhJGxvY2F0aW9uLCAiW14sXSskIikKCiMgVHJpbSBhbnkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCmRhdGEkY291bnRyeSA8LSB0cmltd3MoZGF0YSRjb3VudHJ5KQoKIyBSZXBsYWNlIGJsYW5rIGJveCB3aXRoIE5BCmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUodHlwZV9vZl9hdHRhY2sgPSBpZmVsc2UodHlwZV9vZl9hdHRhY2sgPT0gIiIsIE5BLCB0eXBlX29mX2F0dGFjaykpCgp3X2F0dGFja3MgPC1kYXRhICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCBmaWxsID0gdHlwZV9vZl9hdHRhY2spKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgCiAgbGFicyh0aXRsZSA9ICJBdHRhY2tzIGFuZCBDb3VudHJ5IiwKICAgICAgIHggPSAiQ291bnRyeSIsCiAgICAgICB5ID0gIkNvdW50IG9mIEF0dGFja3MiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAKYGBgCgpgYGB7ciwgb3V0LndpZHRoPSI3MCUiLCBvdXQuaGVpZ2h0PSI3MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWVkaWEvd29sdmVzX2F0dGFja3MucG5nIikKYGBgCgojICoqS2luZyoqCgpUaGUgS2luZyBvZiBhdHRhY2tzIGlzIHRoZSBzaGFyay4gVGhlIGRhdGEgc2hvd3MgdGhhdCBzaGFya3MgaGF2ZSBhdHRhY2tlZCwgbG9vayBhdCB0aGUgbWFwIG9mIEF1c3RyYWxpYSBhZ2FpbiwgZXZlcnkgbWFya2VyIGlzIHdoZXJlIGEgc2hhcmsgYXR0YWNrIGhhcyBvY2N1cnJlZC4gQWxzbyBhbm90aGVyIHJlYXNvbiB3aHkgdGhlIHNoYXJrIGRhdGEgaXMga2luZyBpcyBkdWUgdG8gYSBsYWNrIGFuZCBtaXNzaW5nIGRhdGEgZnJvbSBib3RoIHRoZSB3b2x2ZXMgYW5kIGdhdG9ycy4gSWYgdGhlcmUgd2FzIGRhdGEgZm9yIE5pbGUgQ3JvY3MsIHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29tcGV0aXRpb24uIAoKCmBgYHtyLCBvdXQud2lkdGg9IjcwJSIsIG91dC5oZWlnaHQ9IjcwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJtZWRpYS9zaGFyay5wbmciKQpgYGAKCgpbUmV0dXJuIHRvIEhvbWVwYWdlXSguLi9pbmRleC5odG1sKQ==